package com.novatec.dao;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.beanutils.BeanMap;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.novatec.mvc.forms.ContratoForm;
import com.novatec.mvc.modelo.CajasItem;

@SuppressWarnings("unchecked")
public class ClientesDAO {
	
	private final Logger logger = Logger.getLogger(this.getClass());
	private SimpleJdbcTemplate simpleJdbcTemplate;
//	private SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyy");

	@Autowired
    public void init(DataSource dataSource) {
        this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
    }

	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
	public void insertarCajas(CajasItem cajasItem) throws ParseException {
		// TODO Auto-generated method stub
		
		String sql = "INSERT INTO tipocaja " +
		"(NombreTipoCaja,Descripcion,IndActivo,CantidadCajas,Precio)" +
		" VALUES (:nombrecontenedor, :descripcion, 1, :stockglobal, :precio)";
		
		Map<String, ?> cajasMap= new BeanMap(cajasItem);
		MapSqlParameterSource mapSQL= new MapSqlParameterSource(cajasMap);
		simpleJdbcTemplate.update(sql, mapSQL);
	
		logger.debug("cajas insertadas");
	}
	
	@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
	public Map<String, ?> getClienteByRUCDNI(String rucDNI){
		
		String sql= "SELECT idusuario, tipoPersona, ruc_dni, razonSocialNombre, direccion, zona, distrito, provincia, departamento, pais, telefono, email, gps_Latitud, gps_Longitud FROM cliente WHERE ruc_dni = ?";
		logger.debug(sql);
		try{
			return simpleJdbcTemplate.queryForMap(sql, rucDNI);
		}catch(Exception e){
			logger.debug("null for ruc-dni: "+rucDNI);
			return null;
		}
	}

	@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
	public boolean existClienteByRUCDNI(String rucDNI) {
		String sql = "SELECT count(0) FROM cliente WHERE ruc_dni = ?";
		//Si hay datos actualiza de lo contrario inserta
		return simpleJdbcTemplate.queryForInt(sql, rucDNI)>0? true: false;
	}
	
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
	public void actualizarCliente(ContratoForm contratoForm) {
		String sqlUpdate= "UPDATE cliente SET tipoPersona = :tipoPersona, razonSocialNombre = :razonSocialNombre, direccion = :direccion, zona= :zona, distrito= :distrito, provincia= :provincia, departamento= :departamento, pais= :pais, telefono= :telefono, email= :email, gps_Latitud= :gps_Latitud, gps_Longitud= :gps_Longitud WHERE ruc_dni = :ruc_dni";
		Map<String,Object> contratoFormMap= new BeanMap(contratoForm);
		logger.debug(sqlUpdate);
		
		simpleJdbcTemplate.update(sqlUpdate, contratoFormMap);
		logger.debug("cliente actualizado");//update
	}
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
	public void insertarCliente(ContratoForm contratoForm) {
		String sqlInsertUsuario= "INSERT INTO usuario (login, clave) VALUES (:ruc_dni, :ruc_dni)";
		String sqlInsertCliente= "INSERT INTO cliente (idUsuario, tipoPersona, ruc_dni, razonSocialNombre, direccion, zona, distrito, provincia, departamento, pais, telefono, email, gps_Latitud, gps_Longitud) " +
		"VALUES (:idUsuario, :tipoPersona, :ruc_dni, :razonSocialNombre, :direccion, :zona, :distrito, :provincia, :departamento, :pais, :telefono, :email, :gps_Latitud, :gps_Longitud)";
		Map<String,Object> contratoFormMap= new BeanMap(contratoForm);

		//Insertar Usuario
		logger.debug(sqlInsertUsuario);
		simpleJdbcTemplate.update(sqlInsertUsuario, contratoFormMap);
		logger.debug("usuario insertado");//insert
		
		//Recuperar idUsuario
		contratoForm.setIdUsuario(getIdUsuarioByRucDNI(contratoForm.getRuc_dni()));
		logger.debug(sqlInsertCliente);
		//Insertar Cliente
		simpleJdbcTemplate.update(sqlInsertCliente, contratoFormMap);
		logger.debug("cliente insertado");//insert
	}
	@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
	public Long getIdUsuarioByRucDNI(String rucDNI) {
		String sql = "SELECT idUsuario FROM cliente WHERE ruc_dni = ?";
		return (Long) simpleJdbcTemplate.queryForMap(sql, rucDNI).get("idUsuario");		
	}
	
	@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
	public String getLoginFromidUsuario(String idUsuario) {
		String sql = "SELECT login FROM usuario WHERE Idusuario = ?";
		String login = (String) simpleJdbcTemplate.queryForMap(sql, idUsuario).get("login");
		logger.debug(login);
		return login;		
	}
	
	@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
	public Long getRucDniForClienteLogueado(String idUsuario) {
		logger.debug(idUsuario);
		String sql = "SELECT c.RUC_DNI FROM cliente c INNER JOIN usuario u ON u.Idusuario = c.Idusuario WHERE u.Login = ?";
		Long rucdni = (Long) simpleJdbcTemplate.queryForLong(sql, this.getLoginFromidUsuario(idUsuario));
		logger.debug("SELECT  c.RUC_DNI FROM cliente c INNER JOIN usuario u ON u.Idusuario = c.Idusuario WHERE u.Login = " + rucdni);
		logger.debug(rucdni);
		return 	rucdni;
	}

	public List<Map<String,Object>> getClientesLikeRUCDNI(String ruc_dni) {
		String sql= "SELECT c.ruc_dni as ruc_dni FROM cliente c, usuario u WHERE c.idUsuario = u.idUsuario and u.indActivo= '1' and c.ruc_dni like '" + ruc_dni + "%'";
		logger.debug(sql);
		try {
			return simpleJdbcTemplate.queryForList(sql);
		} catch(Exception e){
			e.printStackTrace();
			return new ArrayList<Map<String,Object>>();
		}
	}	
	
}
